ФАЙЛЫ.
Место, где на диске сохраняется та или иная информация, называется
файлом. Файлов на диске множество. Каждая игра, и вообще любая программа,
сохраняется в своем файле. Сколько игр, столько и файлов. Говорят, что когда
происходит сохранение информации в файле, то информация выводится или
записывается из оперативной памяти в файл, а когда игра или другая программа
читает эту информацию из файла, то говорят, что информация вводится или
загружается из файла в оперативную память.
В Visual Basic существует несколько
типов файлов. Мы познакомимся с самым простым из них - текстовым файлом. При
работе с текстовым файлом удобно воображать, что носитель не диск, состоящий
из дорожек, а подобен листу бумаги или экрану монитора, файл же - это строки
информации на этом листе или экране. Запись в файл и считывание из файла
осуществляются магнитной головкой, которая может двигаться по строкам файла
только строго последовательно, не пропуская ни строки, подобно авторучке,
когда вы пишете письмо, или глазу, когда его читаете. Но у магнитной головки
нет свободы глаза или авторучки, которые могут "прыгать" по листу,
как хотят. Головка движется строго последовательно, не пропуская ни символа,
поэтому такие файлы еще называют файлами с последовательным доступом.
Данные
в текстовых файлах могут быть числами, строками или иметь другой тип.
Сейчас на примерах мы научимся
работать с текстовыми файлами.
Пример
1.
Записать слово Улица и число 200
на магнитный диск С: в текстовый файл с именем proba.txt,
располагающийся в папке VB.
Решение. Прежде
всего вы должны убедиться, что такая папка действительно
существует по указанному адресу. Файла же там может и не быть. Затем придумаем
файлу Proba.txt номер, которым
мы будем пользоваться в программе. Пусть это будет 1.
Прежде чем начать работать с
файлом, он должен быть открыт. При этом компьютер выполняет определенные
подготовительные действия для работы с файлом. Вот как выглядит оператор, открывающий
текстовый файл для записи:
Оператор: Open "C:\VB\Proba.txt" For Output As #1
Перевод: Открыть файл "C:\VB\Proba.txt" для
вывода как №1
Если
файл раньше не существовал, то он создается. Если файл открывается для записи,
то магнитная головка перемещается в начало файла. Это означает, как вы можете
догадаться, что если в файле было раньше что-то записано, то все сотрется. Вот
программа:
Private Sub Command1_Click()
'Открыть
для записи файл Proba.txt в папке VB диска С под номером 1
Open "C:\VB\Proba.txt" For Output As #1
Write #1, "Улица" 'Записать в файл № 1 строку "Улица"
Write #1,200 'Записать в файл № 1 в следующую строку число 200
Close #1 'Закрыть файл №1
Еnd Sub
Вы видите, что собственно запись
осуществляется оператором Write. После работы с
файлом его нужно закрыть оператором Close.
Давайте
убедимся, что все действительно правильно записалось.
Для этого выйдем из Visual Basic в Windows, найдем нужную
папку и
обнаружим, что там действительно находится файл Proba.txt. Чтобы
заглянуть в него, щелкните по нему дважды мышкой, он откроется
Программой Notepad -
и вы увидите, что он содержит 2 строки:
"Улица"
200
Если вместо двух операторов Write вы напишете
один: Write
#1, "Улица", 200 в
файл будет записана 1 строка:
"Улица",200
Если вы не
хотите стирать содержимое файла, а просто хотите дописать что-нибудь в его
конец, то вместо слова Output в операторе Open нужно
использовать слово Append.
Удобно
держать текстовый файл, в который ваша программа сохраняет свои данные, в той
же папке, где находятся файлы вашего проекта. В этом случае возникает проблема:
при переносе папки с проектом в другое место диска изменяется ее адрес, а
значит, и адрес файла данных. В операторе же Open указан старый
адрес. Visual Basic выдаст
сообщение об ошибке. В этой ситуации
нужно в операторе Open дать понять
компьютеру, что файл находится именно в папке с файлами проекта: Open App.Path & "\Proba.txt" For...
App.Path - это адрес папки вашего проекта, где бы он ни
путешествовал.
Информация в наш файл может записываться
только по порядку, последовательно. Мы не можем записать что-то сперва в начало файла, потом в конец, потом в середину. То
же самое относится и к считыванию, о котором сейчас пойдет речь.
Пример 2. В
файле Proba1.txt в папке проекта
записаны следующие
строки:
1999
"Азия"
"Африка", 2010
Вывести
третью строку на экран монитора. Вот программа: Private Sub Command3_Click()
Dim a1 As Integer 'Четыре переменные в оперативной памяти,
Dim а2 As String
'в которые будут
загружены данные
Dim аЗ As String 'из первых трех строк '
Dim а4 As Integer 'файла
'Открыть
для
чтения под номером 1 файл Proba1.txt из папки
проекта:
Open App.Path &
"\Proba1.txt" For Input As #1
Input #1, a1 'Чтение 1-й строки
Input #1, a2 'Чтение 2-й строки
Input #1, аЗ, a4 'Чтение 3-й строки
Close #1 'Закрыть файл 1
Print аЗ, а4
End Sub
Вот
результаты в окне Immediate:
Африка 2010
Вы видите, что собственно чтение осуществляется
оператором Input. После
работы с файлом его нужно закрыть оператором Close. Обратите
внимание, что для того, чтобы добраться до 3-й строки, нам пришлось
"зря" прочитать первые две.
Пример 3.
В предыдущем примере мы еще до считывания знали,
как располагаются по строкам и внутри
строк данные в файле Proba1.txt. Однако нередки
случаи, когда мы не имеем об этом представления. Все, что мы знаем, - это то,
что файл состоит из строк. Тем не менее, хочется прочитать данные из файла,
чтобы хотя бы посмотреть на них. Для этого можно приказать Бейсику загружать
каждую строку файла независимо от того, из каких данных она состоит, в
переменную типа String. Вот программа, распечатывающая 3
первые строки файла Proba1.txt:
Private Sub Command4_Click()
Dim s1 As String 'Три переменные в оперативной памяти,
Dim s2 As String
'в которые будут загружены 3
Dim s3 As String 'первые строки файла
Open App.Path & "\Proba1.txt" For Input As #1
Line Input #1, s1 'Чтение очередной строки файла Debug.Print s1
Line Input #1, s2 'Чтение очередной строки файла Debug.Print s2
Line Input #1, s3 'Чтение очередной строки файла Debug.Print s3
Close #1 'Закрыть файл 1
End Sub
Загрузку
очередной строки в переменную типа String выполняет
оператор Line Input. Вот
результаты в окне Immediate:
1999
"Азия"
"Африка",
2010
Вы видите, что кавычки и запятая не
исчезли, как это было в распечатке примера 2. Это потому, что Line Input не обращает
внимания на символы, из которых состоит строка файла. Он просто загружает их
подряд в строковую переменную. В нашем случае, например, строка s3 состоит из
символов "Африка", 2010, включая кавычки и запятую.
Если вы хотите как-то изменить содержимое текстового
файла на диске, то вам целесообразно полностью загрузить его в память, изменить
его там, как вам надо, а затем то, что получилось, целиком записать обратно в
файл.
Пример
4. Файл f состоит из 10
строк. Дописать в конец каждой строки восклицательный знак.
Программа:
Dim s(1 То 10) As String
Private Sub Command 1_Click()
'Загружаем файл в память:
Open App.Path &
"\f.txt" For Input As #1
For i = 1 To 10
Line Input #1, s(i) 'Чтение очередной строки файла Next Close #1
'Преобразовываем
строки в памяти:
Fori = 1 То 10
s(i) = s(i) &"!" 'Добавляем восклицательный знак в каждую строку
Next
'Записываем
преобразованные строки в файл:
Open App.Path & "\f.txt" For Output As #1
For
i = 1 To
10
Print #1, s(i) 'Запись очередной строки в файл
Next
Close #1
End Sub
Вы видите, что в этой программе запись осуществляется оператором Print, а не Write. Иначе бы строки в
результирующем файле брались в кавычки, как это было в примере 2.
Пример 5. Вам нужно
прочесть все строки файла, а сколько строк в файле, вы не знаете.
Ваши
действия
Do While Not E0F(1) 'Выполняй,
пока НЕ наступил КОНЕЦ ФАЙЛА 1
Line
Input #1, s(i)
i = i + 1
Loop
___________ Действия над файлами________
Оператор |
Смысл |
FileCopy "c:\temp\1.txt", "c:\temp\2.txt" |
Оператор FileCopy
копирует файлы. У него 2 параметра: первый - адрес копируемого файла, второй
- адрес файла, в который производится копирование. В данном примере файл 1.txt копируется в свою же
папку под именем 2.txt |
FileCopy "c:\temp\1.txt", "c:\temp\222\4.txt" |
Файл
1.txt
копируется в папку c:\temp\222 под
именем 4.txt |
Name "c:\temp\222\4.txt" As "c:\temp\222\5.txt" |
Оператор
Name As переименовывает и
перемещает файлы и папки. Два его параметра имеют тот же смысл, что и у
оператора FileCopy. В
данном примере файл 4.txt переименовывается в 5.txt и остается в своей папке |
Name "c:\temp\222\5.txt" As "c:\temp\5.txt" |
Файл
5.txt
перемещается в папку temp |
Kill "c:\temp\5.txt" |
Оператор
Kill уничтожает
файл |
Действия
над папками
Оператор |
Смысл |
Name "c:\temp\333" As "c:\temp\444" |
Папка
333 переименовывается в 444 |
Name "c:\temp\666" As "c:\temp\222\666" |
Папка 666 перемещается вместе со всем своим
содержимым внутрь папки 222 |
MkDir "c:\temp\888" |
Создается
пустая папка 888 |
RmDir "c:\temp\888" |
Уничтожается
пустая папка 888 |
В программировании широко используется понятие текущей папки. В данный момент времени
текущая папка может быть только одна. Назначьте текущей папку, с файлами
которой вы в данный момент работаете, и запись адресов в операторах существенно
сократится. Например, работая в папке c:\temp\999,
вы вместо того, чтобы все время писать операторы вида
FileCopy "c:\temp\999\22.txt", "c:\temp\999\44.txt" один раз задаете текущую папку, вот так:
ChDir "c:\temp\999" а затем уже все время пишете операторы
такого вида:
FileCopy "22.txt", "44.txt" Функция CurDir позволяет вам
узнать, какая папка в настоящий момент является текущей. Для этого вам достаточно выполнить оператор Debug.Print CurDir